home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 316 / libsrc / signal.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-20  |  1.5 KB  |  81 lines

  1. /*
  2.  *        Cross Development System for Atari ST 
  3.  *     Copyright (c) 1988, Memorial University of Newfoundland
  4.  *
  5.  *   Signal routine - the signals are actually done by calling the _do_signal
  6.  * routine - similiar to kill() I guess.
  7.  *
  8.  * $Header: signal.c,v 1.1 88/02/03 22:58:53 m68k Exp $
  9.  *
  10.  * $Log:    signal.c,v $
  11.  * Revision 1.1  88/02/03  22:58:53  m68k
  12.  * Initial revision
  13.  * 
  14.  */
  15. #include    <signal.h>
  16. #include    <errno.h>
  17.  
  18. #define    SIG_EXIT    10        /* exit code */
  19.  
  20. struct sigarray_str {
  21.     int    (*s_func)();
  22. };
  23. static struct sigarray_str    sig_array[NSIG] = {
  24.                     SIG_DFL,    /* SIGNULL */
  25.                     SIG_DFL,    /* SIGINT */
  26.                     SIG_DFL,    /* SIGQUIT */
  27.                     SIG_DFL,    /* SIGALRM */
  28.                 };
  29.  
  30. int    (*
  31. signal(sig, func))()
  32.     int    sig;
  33.     int    (*func)();
  34. {
  35.     int    (*oldfunc)();
  36.  
  37.     switch (sig) {
  38.     case SIGINT:
  39.         oldfunc = sig_array[SIGINT].s_func;
  40.         sig_array[SIGINT].s_func = func;
  41.         break;
  42.  
  43.     case SIGQUIT:
  44.         oldfunc = sig_array[SIGQUIT].s_func;
  45.         sig_array[SIGQUIT].s_func = func;
  46.         break;
  47.  
  48.     case SIGALRM:
  49.         oldfunc = sig_array[SIGALRM].s_func;
  50.         sig_array[SIGALRM].s_func = func;
  51.         break;
  52.  
  53.     default:
  54.         errno = EINVAL;
  55.         oldfunc = (int (*)()) -1;
  56.     }
  57.     return oldfunc;
  58. }
  59.  
  60. void
  61. _do_signal(sig)
  62.     int    sig;
  63. {
  64.     int    (*func)();
  65.  
  66.     if (sig >= 0 && sig < NSIG) {
  67.         func = sig_array[sig].s_func;
  68.         if (func == SIG_DFL)
  69.             switch (sig) {
  70.             case SIGQUIT:
  71.             case SIGINT:
  72.             case SIGALRM:
  73.                 exit(SIG_EXIT + sig);
  74.                 break;
  75.             }
  76.         else if (func != SIG_IGN)
  77.             (*func)(sig, 0);
  78.         /* else ignore it */
  79.     }
  80. }
  81.